///******************** NG.Respate(C)  **********************************
//* 产品名称: Respate 科技
//* 文件名称: server.c
//* 功能描述: 系统日志
//* 程序作者: 雷帕特公司(南宫子萍)
//* 程序版本: V1.1														   
//* 编制日期: 2019/1/29
//* QQ:	2085827949
//**********************************************************************/
#include "lap_lib.h"
#include "lap_cs.h"

#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <pthread.h>


/*********************************************************************************
** 函数名称: lap_SeverHandle
** 功能描述: 服务器 客服端连接处理程序
** 输入参数: None.        
** 输出参数: None.
** 返回参数: return response .
**********************************************************************************/
void * lap_SeverHandle(void *fd)
{
	int fd_act  = fd;
	
	lap_syslog("lap_SeverHandle 处理客户端业务ing...");

	
	close (fd_act);
}


/*********************************************************************************
** 函数名称: lap_creatSever
** 功能描述: 创建一个tcp服务器
** 输入参数: None.        
** 输出参数: None.
** 返回参数: return response .
**********************************************************************************/
int lap_creatSever(void)
{
	int  ret = -1;
	
	//创建系统日志
	lap_openlog(WORK_ROOT_DIR"/syslog/log.lap","LapSever");

	//创建子进程
	pid_t pid = -1;
	pid =fork();
	if(pid < 0)		//创建子进程出错
	{
		lap_syslog("lap_creatSever fork Err!");
		return -1;
	}
	else if(pid >0)//这是父进程
	{
		return 0;	
	}
	
	//单例运行
	lap_single(WORK_ROOT_DIR"/mutex/single.lap");
	
	//子进程创建成功
	lap_syslog("lap_creatSever Son fork created!");

	//将子进程变成守护进程
	lap_daemon(WORK_ROOT_DIR);

	//创建TCP/IP服务器
	// 1、创建socket
	// 2、命名套接字,绑定本地的ip地址和端口
	// 3、监听本地套接字
	
	//1、创建socket
	int fd_sck = -1;
	fd_sck = socket(AF_INET, SOCK_STREAM, 0);
	if (fd_sck < 0)
	{
		lap_syslog("lap_creatSever socket Err!");
		exit(-1);
	}
	
	// 2、命名套接字
	struct sockaddr_in addr;
	memset(&addr, 0, sizeof(addr));
	addr.sin_family  = AF_INET;					// 设置地址族
	addr.sin_port    = htons(SERVER_PORT);		// 设置本地端口
	addr.sin_addr.s_addr = inet_addr(SERVER_IP);//自定义IP
	
	//绑定本地的ip地址和端口
	ret = bind(fd_sck,(struct sockaddr *)&addr, sizeof(addr));
	if (ret == -1)
	{
		lap_syslog("lap_creatSever bind Err!");
		exit(-1);
	}
	
	// 3、监听本地套接字
	ret = listen(fd_sck, 50);
	if (ret == -1)
	{
		lap_syslog("lap_creatSever listen Err!");
		exit(-1);
	}

	lap_syslog("lap_creatSever 等待客服端连接....");

	// 处理客户端连接
	while(1)
	{
		struct sockaddr_in client_addr;
		int len = sizeof(client_addr);
		int fd_act = accept(fd_sck, (struct sockaddr *)&client_addr, (socklen_t *)&len);
		if (fd_act == -1)
		{
			lap_syslog("lap_creatSever accept Err!");
			return -1;
		}
		
		lap_syslog("lap_creatSever 客服端连接成功....");

		// 创建一个线程去处理客户端的请求，主线程依然负责监听
		pthread_t id = -1;
		pthread_create(&id, NULL, lap_SeverHandle, (void *)fd_act);	
		pthread_detach(id); 
	}
	return 0;
}

#if 0
int main(void)
{
	lap_creatSever();
	

	return 0;
}
#endif
																	 
